package com.fdb.efp.nls.service.impl.psd;

import com.fdb.basic.framework.core.constant.BaseConstant;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.efp.nls.common.constant.BdLoanConstant;
import com.fdb.efp.nls.service.facade.psd.PsdFailureLmtPrdContService;
import com.fdb.efp.console.common.ConsoleConstant;
import com.fdb.efp.console.common.psd.PsdConstantSet;
import com.fdb.efp.nls.service.facade.CtrLoanContService;
import com.fdb.efp.nls.service.vo.CtrLoanContVO;
import com.fdb.efp.esb.common.constant.MsLoanConstant;
import com.fdb.efp.limit.service.facade.LmtPrdContService;
import com.fdb.efp.limit.service.vo.LmtPrdContVO;
import com.fdb.efp.nls.service.facade.sx.NlsCreditInfoService;
import com.fdb.efp.nls.service.vo.sx.NlsCreditInfoVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * 需求编号：【2019D1218】（普税贷需求）
 * 问题编号：【2019D1218】（授信审批通过超过三个月合同未签订，失效额度任务）
 * 开发人员：【ludayong】
 * 创建日期：【2020/3/18 9:07】
 * 功能描述：
 * 修改日期：【2020/3/18 9:07】
 * 修改描述：
 */
@Service("psdFailureLmtPrdContService")
public class FailureLmtPrdContServiceImpl implements PsdFailureLmtPrdContService {

    private static Logger logger = LoggerFactory.getLogger(FailureLmtPrdContServiceImpl.class);

    @Autowired
    @Qualifier("lmtPrdContService")
    private LmtPrdContService lmtPrdContService;

    @Autowired
    @Qualifier("nlsCreditInfoService")
    private NlsCreditInfoService nlsCreditInfoService;

    @Autowired
    @Qualifier("ctrLoanContService")
    private CtrLoanContService ctrLoanContService;

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（授信审批通过超过三个月合同未签订，失效额度任务）
     * 开发人员：【ludayong】
     * 创建日期：【2020/3/18 9:07】
     * 功能描述：
     * 修改日期：【2020/3/18 9:07】
     * 修改描述：
     */
    @Override
    public void inValidLmtProContWithContNotSign() throws Exception {
        logger.info("普税贷授信审批通过超过三个月合同未签订，失效额度任务处理开始...");
        // 可以配置参数
        Integer pageSize = 1000;
        // 分页信息
        NlsCreditInfoVO pageInfo = new NlsCreditInfoVO();
        // 页数
        int page = 1;
        // pageSize初始化
        pageInfo.setSize(pageSize);
        // 产品编号
        pageInfo.setPrdCode(PsdConstantSet.prdId);
        // 审批状态
        pageInfo.setApprvSts(MsLoanConstant.NlsApplyStateEnum.PASS.getVALUE());
        // 判断循环次数
        int size = nlsCreditInfoService.queryPsdBtApprvDateCount(pageInfo);
        String size_msg = "【普税贷失效额度任务查询授信信息数据量】：" + size;
        logger.info(size_msg, "message{}");
        int loopCount = (size / pageInfo.getSize()) + (size % pageInfo.getSize() == 0 ? 0 : 1);
        for (int i = 0; i < loopCount; i++) {
            String page_msg = "【普税贷失效额度任务查询授信信息】当前页数：" + pageInfo.getPage() + "，分页大小：" + pageInfo.getSize();
            logger.info(page_msg, "message{}");
            // 分页查询查询授信信息，失效额度信息
            inValidLmtProConInfo(Optional.ofNullable(nlsCreditInfoService.queryPsdBtApprvDateByPage(pageInfo)).orElseGet(ArrayList::new));
            // 下一页
            pageInfo.setPage(++page);
        }
        logger.info("普税贷授信审批通过超过三个月合同未签订，失效额度任务处理结束...");
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（失效额度信息）
     * 开发人员：【ludayong】
     * 创建日期：【2020/3/18 9:07】
     * 功能描述：
     * 修改日期：【2020/3/18 9:07】
     * 修改描述：
     */
    private void inValidLmtProConInfo(List<NlsCreditInfoVO> creditList) throws Exception {
        if (Objects.isNull(creditList) || creditList.isEmpty()) {
            logger.info("普税贷失效额度任务查询授信信息为空！");
            return;
        }
        for (NlsCreditInfoVO nlsCreditInfoVO : creditList) {
            // 授信协议信息
            LmtPrdContVO inLmtPrdContVO = new LmtPrdContVO();
            // 授信申请流水号
            inLmtPrdContVO.setLmtApplySeq(nlsCreditInfoVO.getLmtApplySeq());
            // 查询授信协议信息
            LmtPrdContVO queryLmtPrdContVO = lmtPrdContService.queryByPk(inLmtPrdContVO);
            // 授信协议信息不为空
            if (Objects.nonNull(queryLmtPrdContVO)) {
                // 合同信息
                CtrLoanContVO ctrLoanContVo = new CtrLoanContVO();
                // 合同编号
                ctrLoanContVo.setContNo(nlsCreditInfoVO.getLmtApplySeq());
                // 查询合同信息
                CtrLoanContVO queryCtrLoanContVO = ctrLoanContService.queryByCondition(ctrLoanContVo);
                // 合同信息为生效状态时，失效授信协议信息
                if (Objects.isNull(queryCtrLoanContVO) || !BdLoanConstant.CONT_STATE_200.equals(queryCtrLoanContVO.getContState())) {
                    // 更新的授信协议信息
                    if (!ConsoleConstant.LIMIT_STS_03.equals(queryLmtPrdContVO.getLmtStatus())) {
                        updateLmtPrdContInfo(queryLmtPrdContVO);
                    }
                    // 更新的授信信息
                    if (!"06".equals(nlsCreditInfoVO.getApprvSts())) {
                        updateNlsCreditInfo(nlsCreditInfoVO);
                    }
                }
            }
        }
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（失效额度信息）
     * 开发人员：【ludayong】
     * 创建日期：【2020/3/18 9:07】
     * 功能描述：
     * 修改日期：【2020/3/18 9:07】
     * 修改描述：
     */
    private void updateLmtPrdContInfo(LmtPrdContVO queryLmtPrdContVO) throws RuntimeException {
        // 更新的授信协议信息
        LmtPrdContVO udpLmtPrdContVO = new LmtPrdContVO();
        // 授信协议编号
        udpLmtPrdContVO.setLmtContNo(queryLmtPrdContVO.getLmtContNo());
        // 额度状态
        udpLmtPrdContVO.setLmtStatus(ConsoleConstant.LIMIT_STS_03);
        // 失效日期
        udpLmtPrdContVO.setExpireDate(DateTool.getCurrentDate());
        // 最后更新人
        udpLmtPrdContVO.setLastUpdateUser(BaseConstant.ADMIN);
        // 最后更新时间
        udpLmtPrdContVO.setLastUpdateTime(DateTool.getCurrentDateTime());
        int num = lmtPrdContService.updateByPk(udpLmtPrdContVO);
        if (num < 1) {
            logger.error("普税贷失效额度任务，更新额度信息失败！");
            throw new RuntimeException("普税贷失效额度任务，更新额度信息失败！");
        }
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（作废授信信息）
     * 开发人员：【ludayong】
     * 创建日期：【2020/3/18 9:07】
     * 功能描述：
     * 修改日期：【2020/3/18 9:07】
     * 修改描述：
     */
    private void updateNlsCreditInfo(NlsCreditInfoVO nlsCreditInfoVO) throws RuntimeException {
        // 更新的授信信息
        NlsCreditInfoVO updNlsCreditInfoVO = new NlsCreditInfoVO();
        // 授信申请流水号
        updNlsCreditInfoVO.setLmtApplySeq(nlsCreditInfoVO.getLmtApplySeq());
        // 审批状态
        updNlsCreditInfoVO.setApprvSts("06");
        // 最后更新人
        updNlsCreditInfoVO.setLastUpdateUser(BaseConstant.ADMIN);
        // 最后更新时间
        updNlsCreditInfoVO.setLastUpdateTime(DateTool.getCurrentDateTime());
        int num1 = nlsCreditInfoService.updateByPk(updNlsCreditInfoVO);
        if (num1 < 1) {
            logger.error("普税贷失效额度任务，更新额度信息失败！");
            throw new RuntimeException("普税贷失效额度任务，更新额度信息失败！");
        }
    }
}
